home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctjjl86.arc / ANIMATE.ARC / BYTEMOV.ASM < prev    next >
Assembly Source File  |  1986-04-16  |  5KB  |  146 lines

  1. ; *** Listing 8 ***
  2. ;
  3. ;Byte-move graphics driver for putting rectangular images into
  4. ; the Color/Graphics Adapter's medium-resolution memory map.
  5. ;
  6. ; Note: AX,BX,CX,DX,BP,SI,DI destroyed.
  7. ;
  8. one    segment para public 'CODE'
  9.     assume    cs:one,ds:one,es:nothing
  10.     public    form_driver,erase_form_driver
  11. ;
  12. form_driver proc near
  13.     mov    di,[bx+even_line_screen_offset_table]  ;find the 
  14.                 ; offset of the top line of image
  15.     add    di,cx     ;ES:DI now points to byte at which to put
  16.              ; the image's upper left corner
  17.     lodsb         ;get the height of the image
  18.     xor    ah,ah     ;make height a word value for calculations
  19.     mov    bx,ax     ;store height in BX
  20.     lodsb         ;get the width of the image in bytes
  21.     mov    bp,2000h ;calculate the amount to add after even scan
  22.     sub    bp,ax     ; lines are drawn to get to the address of 
  23.              ; the next scan line
  24.     mov    dx,1fb0h ;calculate the amount to subtract after odd 
  25.     add    dx,ax     ; scan lines are drawn to get to the address 
  26.              ; of the next scan line
  27.     jmp    [bx+inline_height_vector_table-2] ;-2 because there 
  28.                     ; is no 0 lines entry point
  29. ;
  30. ;This table is used to find the offset of an even scan line in
  31. ; the memory map of the color graphics adapter in medium res mode.
  32. ;
  33. even_line_screen_offset_table label word
  34. x=0
  35.     rept    100    ;there are 100 even lines
  36.     dw    x*50h    ; each is 50h (80 decimal) long
  37. x=x+1
  38.     endm
  39. ;
  40. ;This is inline code for moving the image into the screen memory map.
  41. ;
  42. label    macro    x    ;this macro is used to label the inline code
  43. line&x&:        ; entry points
  44.     endm
  45. ;
  46. x=42            ;there will be an entry point for each even
  47.             ; number of lines between 2 and 40. They will
  48.             ; be labeled "line2", "line4", ... "line40"
  49.     rept    20
  50. x=x-2            ;calculate no. of lines for this entry point
  51.     label    %x    ;put in label for entry point
  52.     mov    cx,ax    ;put width of image in bytes in CX to prepare 
  53.     rep    movsb    ; for repeated move string on even line
  54.     add    di,bp    ;calc addr. of next line: DI + (2000h-width)
  55.     mov    cx,ax    ;put width of image in bytes in CX to prepare 
  56.     rep    movsb    ; for repeated move string on odd line
  57.     sub    di,dx    ;calc addr. of next line: DI - (1fb0h+width)
  58.     endm
  59.     ret
  60. ;
  61. ;This table is used as an indirect address for jumping into
  62. ; the inline code for image moving.
  63. ;
  64. inline_height_vector_table label word    ;there is no entry point for 
  65.                 ; 0 lines. Starting at 2 eliminates
  66.                 ; the need to store a dummy entry
  67.                 ; point address
  68. entry_address    macro    x    ;this macro is used to generate
  69.         dw    line&x& ; the labels corresponding to the
  70.         endm        ; inline code entry points
  71. ;
  72. x=2
  73.     rept    20
  74.     entry_address    %x
  75. x=x+2
  76.     endm
  77. ;
  78. form_driver endp
  79. ;
  80. ;Byte-move graphics driver for erasing rectangular areas of
  81. ; the Color/Graphics Adapter's medium-resolution memory map.
  82. ;
  83. ; Note: AX,BX,CX,DX,BP,SI,DI destroyed.
  84. ;
  85. erase_form_driver proc near
  86.     mov    di,[bx+even_line_screen_offset_table]  ;find the 
  87.                    ; offset of top line of image
  88.     add    di,cx     ;ES:DI now points to byte at which to put
  89.              ; the image's upper left corner
  90.     lodsb         ;get the height of the image
  91.     xor    ah,ah     ;make height a word value for calculations
  92.     mov    bx,ax     ;store height in BX
  93.     lodsb         ;get the width of the image in bytes
  94.     mov    bp,2000h ;calculate the amount to add after even scan
  95.     sub    bp,ax     ; lines are drawn to get to the address of 
  96.              ; the next scan line
  97.     mov    dx,1fb0h ;calculate the amount to subtract after odd 
  98.     add    dx,ax     ; scan lines are drawn to get to the address 
  99.              ; of the next scan line
  100.     mov    si,ax     ;save width in SI for this erase driver
  101.     mov    al,ah     ;zero AL (data to blank with)
  102.     jmp    [bx+erase_height_vector_table-2] ;-2 because there is 
  103.                          ; no 0 lines entry point
  104. ;
  105. ;This is inline code for erasing the image from the screen memory map.
  106. ;
  107. elabel     macro     x    ;this macro is used to label the inline code
  108. eline&x&:        ; entry points
  109.     endm
  110. ;
  111. x=42            ;there will be an entry point for each even
  112.             ; number of lines between 2 and 40. They will
  113.             ; be labeled "eline2", "eline4", ... "eline40"
  114.     rept    20
  115. x=x-2            ;calc number of lines for this entry point
  116.     elabel    %x    ;put in label for entry point
  117.     mov    cx,si    ;put width of image in bytes in CX to prepare 
  118.     rep    stosb    ; for repeated store string instruction
  119.     add    di,bp    ;calc address of next line DI + (2000h-width)
  120.     mov    cx,si    ;put width of image in bytes in CX to prepare 
  121.     rep    stosb    ; for repeated store string instruction
  122.     sub    di,dx    ;calc address of next line DI - (1fb0h+width)
  123.     endm
  124.     ret
  125. ;
  126. ;This table is used as an indirect address for jumping into
  127. ; the inline code for image erasing.
  128. ;
  129. erase_height_vector_table label word    ;there is no entry point for 
  130.                     ; 0 lines. Starting at 2 
  131.                     ; eliminates the need to store 
  132.                     ; a dummy entry point address
  133. erase_entry_address   macro   x   ;this macro is used to generate
  134.         dw    eline&x&  ; the labels corresponding to the
  135.         endm          ; inline code entry points
  136. ;
  137. x=2
  138.     rept    20
  139.     erase_entry_address   %x
  140. x=x+2
  141.     endm
  142. ;
  143. erase_form_driver endp
  144. one    ends
  145.     end
  146.